/*
 * DocumentoDAO.java
 *
 * Created on 8 de marzo de 2007, 03:52 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.services.utilities.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.services.base.constantes.ConstantesGenerales;
import com.src.computec.radar.services.utilities.dto.DocumentoDto;
import com.src.computec.radar.services.utilities.dto.EnvioDto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author aocampo
 */
public class DocumentoDAO extends GenericDAO implements BaseDocumentoDAO {
    
    /** Creates a new instance of DocumentoDAO */
    public DocumentoDAO() {
    }
    
    public List getDocumentosByEnvio(EnvioDto dto) throws DAOException 
    {
        ConstantesGenerales constantesGenerales = ConstantesGenerales.getInstance();
        
        List listDocumentos = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT D.CODIGO_BARRAS, D.CODIGO_SUBPRODUCTO, D.CODIGO_INTERNO_CLIENTE, D.NUMERO_DOCUMENTO, D.CODIGO_SEGMENTO_SUBPRODUCTO, D.NOMBRE_ABONADO, D.CODIGO_TIPO_IDENTIFICACION, D.NUMERO_IDENTIFICACION_ABONADO, D.TELEFONO_ABONADO, D.FECHA_DOCUMENTO, " +
                                             "SP.DESCRIPCION_SUBPRODUCTO, SSP.DESCRIPCION_SEGMENTO, TI.NOMBRE_IDENTIFICACION, D.FECHA_CORTE_DOCUMENTO, D.PATH_DOCUMENTO " +
                                             "FROM " + constantesGenerales.SCHEMA + ".DOCUMENTO D " +
                                             "INNER JOIN " + constantesGenerales.SCHEMA + ".SUBPRODUCTO SP ON D.CODIGO_SUBPRODUCTO = SP.CODIGO_SUBPRODUCTO " +
                                             "INNER JOIN " + constantesGenerales.SCHEMA + ".SEGMENTO_SUBPRODUCTO SSP ON D.CODIGO_SUBPRODUCTO = SSP.CODIGO_SUBPRODUCTO AND D.CODIGO_SEGMENTO_SUBPRODUCTO = SSP.CODIGO_SEGMENTO_SUBPRODUCTO " +
                                             "INNER JOIN " + constantesGenerales.SCHEMA + ".TIPO_IDENTIFICACION TI ON D.CODIGO_TIPO_IDENTIFICACION = TI.CODIGO_TIPO_IDENTIFICACION " +
                                             "WHERE D.CODIGO_BARRAS = ?");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoBarras());
            rs = statement.executeQuery();
            while (rs.next()) {
                indice = 0;
                DocumentoDto documentoDto = new DocumentoDto();
                documentoDto.setCodigoBarras(rs.getString(++indice));
                documentoDto.setCodigoSubProducto(rs.getString(++indice));
                documentoDto.setCodigoInternoCliente(rs.getString(++indice));
                documentoDto.setNumeroDocumento(rs.getString(++indice));
                documentoDto.setCodigoSegmentoSubProducto(rs.getString(++indice));
                documentoDto.setNombreAbonado(rs.getString(++indice));
                documentoDto.setCodigoTipoIdentificacion(rs.getString(++indice));
                documentoDto.setNumeroIdentificacionAbonado(rs.getString(++indice));
                documentoDto.setTelefonoAbonado(rs.getString(++indice));
                documentoDto.setFechaDocumento(rs.getDate(++indice));
                documentoDto.setDescripcionSubProducto(rs.getString(++indice));
                documentoDto.setDescripcionSegmentoSubProducto(rs.getString(++indice));
                documentoDto.setNombreTipoIdentificacion(rs.getString(++indice));
                documentoDto.setFechaCorteProceso(rs.getDate(++indice));
                documentoDto.setPathDocumento(rs.getString(++indice));
                listDocumentos.add(documentoDto);
            }
        }
        catch (SQLException e) {
            throw new DAOException("DocumentoDAO:getDocumentosByEnvio: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return listDocumentos;
    }
    
    public DocumentoDto getDocumentoByMinimunParameters(DocumentoDto dto) throws DAOException {
        ConstantesGenerales constantesGenerales = ConstantesGenerales.getInstance();
        String SCHEMA = constantesGenerales.SCHEMA;
        DocumentoDto documentoDto = null;
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            int dateCompuesta = (Integer.parseInt(dto.getYear()) * 100) + Integer.parseInt(dto.getMonth());        
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_BARRAS " +
                                             "FROM " + SCHEMA + ".DOCUMENTO " +
                                             "WHERE CODIGO_INTERNO_CLIENTE = ? AND CODIGO_CLIENTE = ? AND (YEAR(FECHA_PROCESO) * 100) + MONTH(FECHA_PROCESO) <= " + dateCompuesta + " AND CODIGO_SUBPRODUCTO = ? AND NUMERO_DOCUMENTO = ? " +
                                             "ORDER BY FECHA_PROCESO DESC " +
                                             "FETCH FIRST 1 ROWS ONLY");
            int indice = 0;
            statement.setObject(++indice, dto.getCodigoInternoCliente());
            statement.setObject(++indice, dto.getCodigoCliente());
            statement.setObject(++indice, dto.getCodigoSubProducto());
            statement.setObject(++indice, dto.getNumeroDocumento());
            rs = statement.executeQuery();
            if (rs.next()) {
                indice = 0;
                documentoDto = new DocumentoDto();
                documentoDto.setCodigoBarras(rs.getString(++indice));
            }
        }
        catch (SQLException e) {
            throw new DAOException("DocumentoDAO:getDocumentoByMinimunParameters: " + e.toString(), e);
        }
        catch (NumberFormatException e) {
            throw new DAOException("DocumentoDAO:getDocumentoByMinimunParameters: " + e.toString(), e);
        }
        catch (Exception e) {
            throw new DAOException("DocumentoDAO:getDocumentoByMinimunParameters: " + e.toString(), e);
        }
        finally {
            closeConnection(con, statement, rs);
        }
        return documentoDto;
    }
}